#include<stdio.h>
// 分支语句、循环语句
//---------------------------------------------小节分割线--------------------------------------------
// 分支语句：if、switch
// int main()
// {
//     int age = 60;
//     if (age < 18)
//     {
//         printf("少年\n");
//     }
//     else if (age>= 18 && age < 26)
//     {
//         printf("青年\n");
//     }
//     else if (age>= 26 && age < 40)
//     {
//         printf("中年\n");
//     }
//     else
//     {
//         printf("壮年以上\n");
//     }
//     return 0;
// }
//---------------小分割线 >.< --------------------
// 容易踩的坑
// int main()
// {
//     int a = 0;
//     int b = 2;
//     if(a == 1)
//         if(b == 2)
//             printf("hehe\n");
//     else
//         printf("haha\n");
//     return 0;
// }
// 这里的结果是不打印，因为else其实是与内层if(b == 2)对应的，而不是上面if(a == 1)
// else和自己离得最近的if匹配
// 注意代码的书写风格，最好戴上大括号，否则写多了就是屎山
// 可以读一读《高质量的C-C++编程》这本书

//---------------------------------------------小节分割线--------------------------------------------
// 练习1：判断一个数是否是奇数
// int main()
// {
//     int a = 0;
//     scanf("%d", &a);
//     if (1 == a % 2) // 这里不写a % 2 == 1，是因为如果把==错写成=，1在左边会报错，但右边不会
//     {
//         printf("奇数");
//     }
//     else
//     {
//         printf("偶数");
//     }
    
//     return 0;
// }
//---------------小分割线 >.< --------------------
// 练习2：打印1~100之间的奇数
// int main()
// {
//     int i = 1;
//     // while (i<=100) // while循环的方法
//     // {
//     //     if (1 == i % 2)
//     //         {
//     //             printf("%d ",i);
//     //         }
//     //     i++;
//     // }

//     //for (i ; i <= 100 ; i++) // for循环的方法
//     for (i ; i <= 100 ; i+=2) // 因为是找奇数，也可以使用i+=2表示
//     {
//         if (1 == i % 2)
//             {
//                 printf("%d ",i);
//             }
//     }
//     return 0;
// }
//---------------------------------------------小节分割线--------------------------------------------
// switch 分支语句
// int main()
// {
//     // 根据数字输出星期几，这里需要使用break
//     int day = 0;
//     scanf("%d", &day);
//     switch (day)
//     {
//     case 1: // case类型必须是整形常量表达式，字符也算整形常量
//         printf("星期一\n");
//         break; // 如果不加这个break; 当前case结束后就会直接执行下一个case的代码
//     case 2:
//         printf("星期二\n");
//         break;
//     case 3:
//         printf("星期三\n");
//         break;
//     case 4:
//         printf("星期四\n");
//         break;
//     case 5:
//         printf("星期五\n");
//         break;
//     case 6:
//         printf("星期六\n");
//         break;
//     case 7:
//         printf("星期天\n");
//         break;
//     default:
//         printf("啊不对不对不对\n");
//         break;
//     }
//     return 0;
// }
//---------------小分割线 >.< --------------------
// int main()
// {
//     // 根据周几输出工作日还是休息日，这里不需要全部使用break
//     int day = 0;
//     scanf("%d", &day);
//     switch (day)
//     {
//     case 1: 
//     case 2:
//     case 3:
//     case 4:
//     case 5:
//         printf("鸡血鸡血\n");
//         break; // case之后的break不是必须加，根据需求加
//     case 6:
//     case 7:
//         printf("摸鱼摸鱼\n");
//         break;
//     default:
//         printf("啊不对不对不对\n");
//         break;
//     }
//     return 0;
// }
//---------------------------------------------小节分割线--------------------------------------------
// 练习：这个程序输出结果是多少？（对了对了呀哈哈哈哈）
// int main()
// {
//     int n = 1;
//     int m = 2;
//     switch (n)
//    {
//     case 1:
//             m++;
//     case 2:
//             n++;
//     case 3:
//             switch (n)
//            {//switch允许嵌套使用
//              case 1:
//                     n++;
//              case 2:
//                     m++;
//                     n++;
//                     break;
//            }
//     case 4:
//             m++;
//             break;
//     default:
//             break;
//    }
//     printf("m = %d, n = %d\n", m, n);
//     return 0;
// }
//---------------------------------------------小节分割线--------------------------------------------
// while循环
// int main()
// {
//     int i = 1;
//     while (i <= 10)
//     {
//         printf("%d\n",i++);
//     }
    
//     return 0;
// }
//---------------小分割线 >.< --------------------
// 循环中break和continue的使用
// int main()
// {
//     int i = 1;
//     while (i <= 10)
//     {
//         if (4 == i)
//         {
//             continue; // 跳过本次循环中continue之后的代码，直接判断是否要进行下一次循环
//             // 因为跳过了执行i++，所以会打印123之后死循环
//         }
//         else if (7 == i)
//         {
//             break; // 永久的终止循环
//         }
//         printf("%d\n",i);
//         i++;
//     }
//     return 0;
// }
//---------------------------------------------小节分割线--------------------------------------------
// getchar、putchar、文件结束标志
// getchar用来读取一个字符
// EOF - 文件结束标志，相当于-1
// int main()
// {
//     int ch = getchar();
//     printf("%c\n", ch);
//     putchar(ch); // 和上一行效果一样
//     return 0;
// }
//---------------小分割线 >.< --------------------
// 练习：分析代码意义
// int main()
// {
//  int ch = 0;
//  // 程序执行中按下Ctrl + z 可以让程序结束
//  while ((ch = getchar()) != EOF) 
//        putchar(ch);
//     return 0;
// }
//---------------小分割线 >.< --------------------
// scanf、getchar使用注意点
// int main()
// {
//     char password[20] = { 0 };
//     printf("请输入密码:>");
//     scanf("%s", password);
//     printf("请确认密码（Y/N）:>");
//     // getchar(); // 运行一次getchar()，只能清理一个字符\n
//     int tmp = 0;
//     while ((tmp = getchar()) != '\n')
//     {
//         ; // 只要读取的那个字符不是\n，就一直读取，达到清理缓冲区的效果
//     }
//     int ch = getchar();
//     if (ch == 'Y')
//     {
//         printf("输入成功");
//     }
//     else
//     {
//         printf("输入失败");
//     }
//     return 0;
// }
//---------------------------------------------小节分割线--------------------------------------------
// for循环
// 相比于while循环，优势在于初始化、判断、调整都在一起，不会因为代码太长而不方便调整
// int main()
// {
//     int i = 0;
//     for (i = 1; i <= 10; i++) // (表达式1初始化;表达式2判断;表达式3调整)
//     // 表达式1初始化只执行一次
//     {
//         printf("%d\n",i);
//     }
//     return 0;
// }
//---------------小分割线 >.< --------------------
// for循环的break和continue
// 和while循环中的用法一致
// 建议：
// for循环，不要在循环内部调整循环的控制变量，防止循环失去控制
// for循环采取 前闭后开区间 的写法，例如：(i = 0; i < 10; i++)，右边不取等于
// for循环的三个部分在语法上都可以省略但不建议，但是如果 表达式2判断 部分省略，就恒为真了
// int main()
// {
//     int i = 0;
//     for (i = 1; i < 11; i++) // (表达式1初始化;表达式2判断;表达式3调整)
//     // 表达式1初始化只执行一次
//     {
//         // if (i == 5)
//         // {
//         //     break;
//         // }
//         if (i == 5)
//         {
//             continue; // 直接跳到表达式3调整部分
//         }
//         printf("%d\n",i);
//     }
//         return 0;
// }
//---------------小分割线 >.< --------------------
// 也可以使用两个变量控制
// int main()
// {
//     int x, y;
//     for (x = 0, y = 0; x<2 && y<5; ++x, y++)
//         {
//             printf("hehe\n");
//         }
//  return 0;
// }
//---------------小分割线 >.< --------------------
// 小测
// int main()
// {
//     int i = 0;
//     int j = 0;
//     //这里打印多少个内卷?
//     for(i=0; i<3; i++)
//     {
//         for(j=0; j<3; j++)
//             {
//                 printf("内卷\n");
//             }
//     }
// }
// 太简单了 3*3 一看就是9个
//---------------小分割线 >.< --------------------
// 牛逼，再看这个
// int main()
// {
//     int i = 0;
//     int j = 0;
//     //这里打印多少个内卷?
//     for(; i<3; i++)
//     {
//         for(; j<3; j++)
//             {
//                 printf("内卷\n");
//             }
//     }
// }
// 因为省略了一开始的初始化部分，导致i=0的时候，j在0，1，2时候打印了3次
// 等i = 1的时候再进去，j没有被初始化还是等于3，i在1和2的时候都没有打印
// 所以一共只打印了3次
//---------------小分割线 >.< --------------------
//请问循环要循环多少次？
// #include <stdio.h>
// int main()
// {
//  int i = 0;
//  int k = 0;
//  for(i =0,k=0; k=0; i++,k++)
//         k++;
//  return 0;
// }
//注意这里判断过程中，k=0表示赋值，0为假
